#ifndef PROTOCOL_HEAD_
#define PROTOCOL_HEAD_ 1

#define CUR_VERSION  "010000"
#define FDJ_VERSION  "020000"

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "basic/config.h"
#include "stdinc.h"
#pragma pack(push, 1)

#define PACKET_CMD_BREAK	0	// 0 断开连接 
#define PACKET_CMD_RPC		1	// 1 远程调用请求包
#define PACKET_CMD_RET		2	// 2 远程调用返回包
#define PACKET_CMD_EVENT	3	// 3 事件通知
#define PACKET_CMD_MESSAGE	4	// 4 实时消息

// Header of communication data
class RMT_CLASS_EXPORT DATA_HEAD 
{
#define TAG_HAS_CLIENT_INFO 0X01
public :
	uint32 len;					// 数据包长度，含长度
	uint32 count;				// 包号，当有多个包同时返回时,用来识别请求与返回包的关系，同时起到加密混淆的作用
	uint8 cmd;					// 包的指令类型:
								//#define PACKET_CMD_BREAK		0	// 断开连接 
								//#define PACKET_CMD_RPC		1	// 远程调用请求包
								//#define PACKET_CMD_RET		2	// 远程调用返回包
								//#define PACKET_CMD_EVENT		3	// 事件通知
								//#define PACKET_CMD_MESSAGE	4	// 实时消息
	uint8 tag;					// 其他选项：是否包含 clientInfo TAG_HAS_CLIENT_INFO
	char strVersion[6];			// 版本号
	unsigned char md5[16];		// md5 包头校验

	void Init(char* pVersion = CUR_VERSION);
	bool CheckMD5();
	void CreateMD5();
	bool GetTag (uint8 mask) { return (tag & mask) > 0; }
};

#pragma pack(pop)

#endif //PROTOCOL_HEAD_
